# -*- coding: utf-8 -*-
import re

NAME_REG = re.compile('(《.*?》|第.{1,7}?[条款项])')
SPLIT_CHAR = ";\n"


def before_return(images, data):
    """数据返回前会调用该钩子函数进行处理
    使用场景：
    1. 对抽取到的值做某些处理，例如对某些值进行过滤，或者对抽取到的某些值运算等；
    2. 判断抽取到的值是否符合要求，如果符合要求则返回status=1，否则status=0，这样可以用于质检等；
    3. 可以对抽取到的值增加一些变量，或者减少一些变量，增加变量时要主要保持数据结构一致
    :param images list 文档分拆出来的图像列表，特殊情况才需要依赖图像进行计算，例如可以获取每一页的图像大小，总页数等
    :param data list 抽取得到的数据，格式如：
        [
            // 第一个抽取变量
            {
                "variable_name": "变量名",
                "data": [    // 每个抽取变量可能会抽取到多个值
                    {        // 变量对应的第一个抽取到的值
                        "type": "text",   // 值类型，支持有：text/image/table
                        "text": "",       // 当type=text时，该值为抽取到的文本，当type=image时，该值为对应图像的base64字符串
                        "tables": [       // 当type=table时，抽取到的单元格的详细信息
                            "text": [....],
                            "box": [....],
                            "cols": [],
                            "rows": [],
                        ],
                        "page": [1],      // 抽取到的值所在的页码，可能会包含多个值
                        "box": [[x1, y1, x2, y2]],  // 抽取到的值所在的box，可能会包含多个box
                        ....
                    },
                    // 更多抽取到的值
                ]
            },
            // 更多抽取变量......
        ]
    :return status int 后处理状态，通常用于标识成功或者失败，该值会存储到数据库的machine_status字段中，该值没有统一的定义，各个文档类型可以自定义解释即可
    :return data list 处理后的抽取数据，注意格式要和输入保持一致
    """
    status = 0
    for var in data:
        if var['variable_name'] == '需要处理的变量名':
            for item in var['data']:
                for cell in item['tables']:
                    cell['text'] = [_parse_text("\n".join(cell['text']))]

    return status, data


def _parse_text(text: str) -> str:
    """格式化处理文本
    Args:
        text (str): 原始文本
    Returns:
        str: 处理后的文本
    """
    items = []
    curr_name, curr_item = None, []
    last_start, last_end = None, None
    matches = NAME_REG.finditer(text)
    for match in matches:
        # print(match, " ====> ", match.groups(), match.span(0))
        start, end = match.span(0)
        item_text = text[start:end]
        if curr_name is None:   # 处理首个
            if text[start] != '《':
                continue
            curr_name = item_text
            curr_item = [curr_name]
            last_start, last_end = start, end
            continue
        if text[start] == '《':   # 出现新的
            items.append(curr_item)
            curr_name = item_text
            curr_item = [curr_name]
            last_start, last_end = start, end
            continue
        # TODO 可以校验是否满足规则
        if last_end == start:     # 连续的
            curr_item.append(item_text)
            last_start, last_end = start, end
            continue
        if last_end+1 == start:     # 并列关系: 加入前面的，并开启新的
            # print(f"------------------> {match}")
            items.append(curr_item)
            end_word = item_text[-1]   # 最后一个字
            new_curr_item = []
            for i_text in curr_item:
                if i_text[-1] != end_word:
                    new_curr_item.append(i_text)
                    continue
                break
            curr_item = new_curr_item
            curr_item.append(item_text)
            last_start, last_end = start, end
            continue
        print(f"可能需要关注的匹配: {match}")

    if curr_item:
        items.append(curr_item)

    items = [''.join(i) for i in items]
    # print(items)
    return SPLIT_CHAR.join(items)


if __name__ == '__main__':
    examples = [
        {
            'text': '《化妆品卫生监督条例》第二十五条',
            'data': [{'name': '化妆品卫生监督条例', 'item_index': '第二十五条'}],
        },
        {
            'text': '《化妆品监督管理条例》第五十九条第（三）项',
            'data': [{'name': '化妆品监督管理条例', 'item_index': '第五十九条', 'part_index': '第（三）项'}],
        },
        {
            'text': '《化妆品监督管理条例》第五十九条第（三）项',
            'data': [{'name': '化妆品监督管理条例', 'item_index': '第五十九条', 'part_index': '第（三）项'}],
        },
        {
            'text': '《中华人民共和国律师法》第五十条第一款第一项和第三项',
            'data': [{'name': '中华人民共和国律师法', 'item_index': '第五十条', 'section_index': '第一款', 'part_index': '第一项'},
                     {'name': '中华人民共和国律师法', 'item_index': '第五十条', 'section_index': '第一款', 'part_index': '第三项'}],
        },
        {
            'text': '依据《中华人民共和国港口法》第四十九条“未依法取得港口经营许可证从事港口经营的”和《港口经营管理规定》第四十一条第一款“未依法取得港口经营许可证，从事港口经营的”之规定。',
            'data': [{'name': '中华人民共和国港口法', 'item_index': '第四十九条'},
                     {'name': '港口经营管理规定', 'item_index': '第四十一条', 'section_index': '第一款'}],
        },
        {
            'text': '依据《中华人民共和国港口法》第四十九条“未依法取得港口经营许可证从事港口经营的”和《港口经营管理规定》第四十一条第一款“未依法取得港口经营许可证，从事港口经营的”之规定，以及《广东省交通运输行政处罚裁量标准（港口行政2021年版）》的相关规定，根据违法事实、性质、情节和社会危害程度将该违法行为认定为较重。',
            'data': [{'name': '中华人民共和国港口法', 'item_index': '第四十九条'},
                     {'name': '港口经营管理规定', 'item_index': '第四十一条', 'section_index': '第一款'},
                     {'name': '广东省交通运输行政处罚裁量标准（港口行政2021年版）'}],
        },
        {
            'text': '依据《中华人民共和国安全生产法》第一百零二条“生产经营单位未采取措施消除事故隐患的，责令立即消除或者限期消除……”之规定，根据违法事实、性质、情节和社会危害程度将该违法行为认定为轻微。',
            'data': [{'name': '中华人民共和国安全生产法', 'item_index': '第一百零二条'}],
        },
        {
            'text': '根据《中华人民共和国政府采购法》第七十七条第一款、第七十二条第一项、《中华人民共和国政府采购法实施条例》第七十四条第七项的规定',
            'data': [{'name': '中华人民共和国政府采购法', 'item_index': '第七十七条', 'section_index': '第一款'},
                     {'name': '中华人民共和国政府采购法', 'item_index': '第七十二条', 'section_index': '第一项'},
                     {'name': '中华人民共和国政府采购法实施条例', 'item_index': '第七十四条', 'section_index': '第七项'}],
        },
    ]
    indexes = ['name', 'item_index', 'section_index', 'part_index']
    for sample in examples:
        resp = _parse_text(sample['text'])
        for i in sample['data']:
            i['name'] = f"《{i['name']}》"
        outputs = [''.join([item[i] for i in indexes if i in item]) for item in sample['data']]
        if resp != SPLIT_CHAR.join(outputs):
            print("\n--->", sample)
            print(f"识别的输出: {resp}")
            print(f"期待的输出: {outputs}")
            raise Exception("异常")

    data = [
        {
            "variable_name": "需要处理的变量名",
            "data": [
                {
                    "type": "text",
                    "text": '',
                    "tables": [{'text': i['text']} for i in examples],
                    "page": [1],
                    "box": [[1, 1, 10, 10]],
                },
            ]
        },
    ]
    _, resp = before_return([], data)
    print(resp)
